package com.java.yz.day08.ketang;

/*
    在现实生活中，有些概念并没有具体的事物体现的时候，我们在java定义该类的时候，我们就不应该定义具体的类，
    因为具体的类可以创建对象
    java就提供了一个关键字 -- abstract 抽象的
    abstract 的用法：
        可以修饰类   abstract关键字加在类的前面，这样就成为了一个抽象类
        修饰成员方法   加在修饰符  与   返回值类型之间

     abstract 的注意事项：
        1.如果一个具体的类继承抽象的话，具体类中必须要重写抽象类中的所有的（重点！！）抽象方法
        2.如果一个类中有抽象方法，那么这个类就必须要定义为抽象类
        3.在抽象类中既可以存在抽象的方法，也可以存在具体实现的方法
        4.抽象类继承抽象类的时候，可以不重新写父类的抽象方法，也可以重新写
        5.抽象类中既可以存在变量有可以存在常量
        6.抽象类不能够实例化，就是不能new创建对象
        7.抽象类中有构造方法，抽象类中存在构造方法的目的：将将来的父类做初始化
 */
abstract class Animal4{
    int a =10;
    final int b=20;  //常量
    Animal4(){    //抽象类的构造方法为将来的父类做初始化的作用

    }
    public abstract void eat();  //注意

    public void sleep(){
        System.out.println("睡觉");
    }
}
//这样就创建好了一个抽象类

class Dog4 extends Animal4{
    @Override
    public void eat() {
        System.out.println("狗吃肉");
    }   //这里的继承必须要重写
}

public class AbstractDemo1 {
    public static void main(String[] args) {
        Dog4 dog4 = new Dog4();
        System.out.println(dog4.b);
        dog4.sleep();
    }
}
